package someTestExcemple.huaweiOd.container.array;
import java.util.*;
//https://blog.csdn.net/guorui_java/article/details/138416166
//华为OD机试 - 会议室占用时间段（Java 2024 C卷 100分）
//典型区间合并问题

/**
 * 这个问题要求我们找出所有会议的时间段的合并，
 * 即计算所有会议时间段的并集。这是一个典型的区间合并问题，可以通过如下步骤解决：
 * 排序: 首先按每个会议的开始时间对会议进行排序。
 * 合并区间: 遍历排序后的会议列表，
 * 对于每个会议，如果它与上一个会议有重叠或相接，则合并这两个会议；如果没有重叠，则开始一个新的会议时间段。
 * 输出结果: 所有合并后的会议时间段即为会议室的占用时间段。
 */

//一、题目描述
//        现有若干个会议，所有会议共享一个会议室，用数组表示各个会议的开始时间和结束时间，
//
//        格式为: [[会议1开始时间，会议1结束时间]，[会议2开始时间，会议2结束时间]] 请计算会议室占用时间段。
//
//        二、输入描述
//        [[会议1开始时间，会议1结束时间]，[会议2开始时间，会议2结束时间] ]
//
//        备注:
//
//        会议个数范围: [1,100]
//
//        会议室时间段: [1,24]
//
//        三、输出描述
//        输出格式预输入一致,具体请看用例。
//
//        [[会议开始时间，会议结束时间]，[会议开始时间，会议结束时间]
//
//        1、输入
//        [[1 ,4],[4,5]]
//
//        2、输出
//        [[1,5]]
public class MeetingTime {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String strIn = sc.nextLine();
        strIn = strIn.substring(1, strIn.length()-1); //先去掉最外面的空格
        List<Meeting> meetings = new ArrayList<>();
        // 再把所有符号都去掉
        strIn = strIn.replace("[","").replace("]","").replace(" ","");
        String[] arr = strIn.split(",");
        //两两读数，获取每个会议的开始时间和结束时间
        for(int i = 0; i < arr.length; i+=2) {
            meetings.add(new Meeting(Integer.valueOf(arr[i]), Integer.valueOf(arr[i+1])));
        }
        //会议按开始时间进行升序
        meetings.sort(new Comparator<Meeting>() {
            @Override
            public int compare(Meeting o1,Meeting o2) {
                if(o1.start != o2.start) {
                    return o1.start - o2.start;
                } else {
                    return  o1.end -o2.end;
                }
            }
        });
        List<Meeting> result = new ArrayList<>();
        Meeting cur = meetings.get(0);
        for(int i = 1; i < meetings.size(); i++) {
            //会议有重叠
            if(meetings.get(i).start <= cur.end) {
                cur.end = Math.max(cur.end, meetings.get(i).end);
                //避免重复加入 --循环后add
            } else {
                result.add(cur);
                cur = meetings.get(i);
            }
        }
        //加入最后一个会议 --前面没加这里别忘记
        result.add(cur);
        //按[[1,5]]输出结果
        StringJoiner sj = new StringJoiner(",");
        for(Meeting meeting : result) {
            sj.add("[" + meeting.start + "," + meeting.end + "]");
        }
        System.out.println("["+sj+"]");

    }

    public static class Meeting {
        Integer start;
        Integer end;

        public Meeting(Integer start, Integer end) {
            this.start = start;
            this.end = end;
        }
    }
}
//[[1,4], [2,5],[7,9], [14,18]]